﻿#pragma once

#include "MainWindow.h"

// 渲染头文件
#include <Prs3d_LineAspect.hxx>
#include <Prs3d_ShadingAspect.hxx>

// 图形交互
#include <AIS_InteractiveContext.hxx>
#include <OpenGL_GraphicDriver.hxx>
#include <Prs3d_PointAspect.hxx>
#include <StdSelect_BRepOwner.hxx>
#include <V3d_Viewer.hxx>

// 视口和窗口
#include <V3d_View.hxx>
#include <WNT_Window.hxx>

// 光照头文件
#include <V3d_AmbientLight.hxx>
#include <V3d_DirectionalLight.hxx>

// 网格头文件
#include <MeshVS_MeshPrsBuilder.hxx>
#include <MeshVS_NodalColorPrsBuilder.hxx>

// 纹理信息
#include <Graphic3d_Texture2D.hxx>
#include <Graphic3d_TypeOfTexture.hxx>
#include <Image_PixMap.hxx>

namespace Ui
{
class OCCWidget;
}

class OCCWidget : public QWidget
{
    Q_OBJECT

  public:
    enum class Action3d
    {
        Nothing,
        Panning, // 平移
        Zooming, // 缩放
        Rotation // 旋转
    };

    explicit OCCWidget(QWidget *parent);
    ~OCCWidget();

    void initialize();                                                           // 初始化窗口
    void update_interactive_context();                                           // 刷新上下文数据
    void adjust_selection_style(const Handle(AIS_InteractiveContext) & context); // 修改选择风格
    void fit_all_shapes();                                                       // 适应窗口

    std::vector<TopoDS_Shape> selected_shapes();    // 获得被选中的形状
    Handle(AIS_PointCloud) selected_point_cloud(); // 获得被选中的点云

    virtual void resizeEvent(QResizeEvent *event);
    virtual void paintEvent(QPaintEvent *);
    virtual void mousePressEvent(QMouseEvent *);   // 按下
    virtual void mouseReleaseEvent(QMouseEvent *); // 抬起
    virtual void mouseMoveEvent(QMouseEvent *);    // 移动
    virtual void wheelEvent(QWheelEvent *);        // 滚轮
    virtual QPaintEngine *paintEngine() const;

  private:
    Ui::OCCWidget *ui;

    Action3d m_mode; // 记录操作模式
    QPoint m_pos;    // 记录鼠标平移坐标

    Handle(V3d_View) m_hView;                     // 视口句柄
    Handle(V3d_Viewer) m_hViewer;                 // 定义 V3d_Viewer 句柄
    Handle(AIS_InteractiveContext) m_hAisContext; // 定义交互上下文

    MainWindow *m_parent; // 保存父窗口
};